/**
 * 面向对象编程
 * 函数对象和普通对象
 */
class Father {
    test(){
        return 0;
    }
    static test1(){
        return 1;
    }
}

/**
 * 类的构造函数，不使用new是没法调用的，会报错。
 * 声明一个类
 * 继承父类说明原型就是父类 Demo.prototype = Father
 */
class Demo extends Father {
    /**
     * 构造函数
     * 子类 constructor 方法中必须有 super ，且必须出现在 this 之前。
     * super类似于ES5语法中的call继承
     * @use new Demo().version;
     */
    constructor(v = '1.0.0') {
        super();
        this.version = v;
    }

    /**
     * 实例属性,实例方法
     * 类似在原型上添加方法
     * @use new Demo().fn();
     * @use new Demo().param
     */
    param = 'new params';
    fn() {
        console.log(this.param);
    }

    /**
     * 静态属性和方法
     * @use Demo.NUM
     * @usr Demo.getNum()
     */
    static NUM = 123;
    static getNum() {
        return this.NUM;
    }
}
// 上述代码等价于
// Demo.prototype = {
//     constructor() {},
//     fn(){}
// }

// Object.assign方法可以很方便地一次向类添加多个方法。
// 扩展
// 会覆盖上面的
Object.assign(Demo.prototype, {
    fn(){},
    todo(){}
});


export default Demo;